컴포넌트 응집도

Clean Architecture - Item 13

Posted by Songi on 2019-10-20

컴포넌트 응집도

어느 클래스를 어느 컴포넌트에 포함시켜야 할까? 다음은 컴포넌트 응집도에 관련된 세 가지 원칙이다.

REP : 재사용/릴리스 등가 원칙

CCP : 공통 폐쇄 원칙

CRP : 공통 재사용 원칙

REP : 재사용/릴리스 등가 원칙

재사용 단위는 릴리스 단위와 같다.

factory method pattern

semantic versioning

우리에게 REP 는 어찌보면 너무나 당연해 보인다. 하지만 이 원칙만으로는 클래스와 모듈을 단일 컴포넌트로 묶는 방법을 제대로 설명하기힘들다.

그렇더라도 이 원칙 자체는 중요하다.

“소프트웨어 컴포넌트가 릴리스 절차를 통해 추적, 관리 된다. 릴리스 번호로 인해 재사용 컴포넌트들이 서로 호환되는지 보증한다.”
“새로운 버전이 언제 출시되고, 무엇이 변했는지를 개발자들이 알 수있다.”
“컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 목적이나 테마가 있어야 한다.”
“하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 함께 릴리스 할 수 있어야 한다. “
“하나의 컴포넌트로 묶인 클래스와 모듈은 버전 번호가 같아야 한다.”
“동일한 릴리스로 추적 관리되며, 동일한 릴리스문서에 포함되어야 한다.”
“이 원칙을 소프트웨어 설계와 아키텍처 관점에서 보면 단일 컴포넌트는 응집성 높은 클래스와 모듈들로 구성되어야 한다.”

CCP : 공통 폐쇄 원칙

동일한 이유로, 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라.
서로 다른 시점에 다른 이유로 변경되는 클래스를 다른 컴포넌트로 묶어라.

factory method pattern

CCP는 컴포넌트 관점에서 SRP를 다시 쓴 것이다.

단일 컴포넌트는 변경의 이유가 여러개 있어서는 안된다. CCP는 변경될 가능성이 있는 클래스는 모두 한 곳으로 묶을 것을 권장한다.

물리적, 개념적으로 강하게 결합되어 항상 함께 변경되는 클래스들은 하나의 컴포넌트에 속해야 한다.

OCP에서 말하는 폐쇄와 뜻이 같다.

발생할 가능성이 있거나, 과거에 발생했던 대다수의 공통적인 변경에 대해 클래스가 닫혀 있도록 설계해야 한다.

CCP에서 동일한 유형의 변경에 대해 닫혀 있는 클래스들을 하나의 컴포넌트로 묶는다. 따라서 변경이 필요한 요구사항이 발생했을 때 영향을 받는 컴포넌트들이 최소화 된다.

CRP : 공통 재사용 원칙

컴포넌트 사용자들을 필요하지 않는 것에 의존하게 강요하지 말라.

클래스와 모듈을 어느 컴포넌트에 위치시킬 지 결정할 때 도움되는 원칙이다. 같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 한다고 말하고 있다.

또한 각 컴포넌트에 어떤 클래스를 포함시켜야 하는지 설명한다.

예로 컨테이너 클래스와 해당 클래스의 이터레이터 클래스의 경우 서로 강하게 결합되어 있기 때문에 함께 재사용된다. 따라서 반드시 동일한 컴포넌트에 위치해야 한다.

동일한 컴포넌트로 묶어서는 안되는 클래스도 말해준다.

의존하는 컴포넌트가 있다면 해당 컴포넌트의 모든 클래스에 대해 더 작게 그룹지을 수 없다. 일부 클래스에만 의존하고 다른 클래스와는 독립적일 수 없음을 확실히 인지해야 한다.

강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안된다.

ISP의 포괄적 버전

사용하지 않는 클래스를 가진 컴포넌트에 의존하지 마라

필요하지 않은 것에 의존하지 말라.

컴포넌트 응집도에 대한 균형 다이어그램

factory method pattern

위 균형 다이어그램은 응집도에 관한 세 원칙이 서로 어떻게 상호작용 하는지 보여준다.

다이어그램 각 변은 반대쪽 꼭지점에 있는 원칙을 포기했을 때 감수해야 하는 비용을 나타낸다.

– REP와 CCP는 포함의 원칙 > 컴포넌트를 크게 만듬

– CRP는 배제의 원칙 > 컴포넌트를 작게 만듬

따라서 이 원칙들이 균형이 이루는 방법을 찾아내야 한다.

일반적으로 프로젝트는 삼각형의 오른쪽에서 시작하는 편이며, 점차 왼쪽으로 이동해 간다. 즉, 프로젝트의 컴포넌트 구조는 시간과 성숙도에 따라 변한다. 프로젝트가 실제로 수행하는 일 자체보다는 프로젝트가 발전되고 사용되는 방법에 더 관련이 깊다는 얘기이다.

결론

어느 클래스들을 묶어서 컴포넌트로 만들지 결정할 떄, 재사용성과 개발가능성이라는 상충하는 힘을 반드시 고려해야 한다.

이들의 균형점은 항상 유동적이여서 시간의 흐름에 따라 프로젝트의 초점이 변해가며 균형 또한 같이 변해간다.

출처

https://www.slideshare.net/matthiasnoback/principles-of-package-design-fosdem-2015
https://adriancitu.com/tag/the-common-closure-principle/